package dao

import (
	"github.com/astaxie/beego/orm"
	"time"
)

// 这是 UmsMenu 的全局公开dao对象，被service层调用!
var UmsMenuDao = umsMenuDao{}

// 这是 ums_menu表 的实体类
type UmsMenu struct {
	Id         int64     `json:"id" form:"id"`
	ParentId   int64     `json:"parent_id" form:"parent_id"`     // 父级ID
	Title      string    `json:"title" form:"title"`             // 菜单名称
	Level      int32     `json:"level" form:"level"`             // 菜单级数
	Sort       int32     `json:"sort" form:"sort"`               // 菜单排序
	Name       string    `json:"name" form:"name"`               // 前端名称
	Icon       string    `json:"icon" form:"icon"`               // 前端图标
	Hidden     int32     `json:"hidden" form:"hidden"`           // 前端隐藏
	CreateTime time.Time `json:"create_time" form:"create_time"` // 创建时间
}

// 注意:这是 UmsMenu 的私有dao对象，只能在dao层内使用!
type umsMenuDao struct {
	Insert           func(args UmsMenu) (int64, error)
	UpdateById       func(args UmsMenu) (int64, error)          `args:"id"`
	SelectById       func(id int64) (UmsMenu, error)            `args:"id"`
	DeleteById       func(id int64) (int64, error)              `args:"id"`
	SelectByParentId func(parentId int64) ([]UmsMenu, error)    `args:"parent_id"`
	UpdateLevel      func(level int32) (int64, error)           `args:"level"`
	UpdateLevelById  func(id int64, level int32) (int64, error) `args:"id,level"`
	List             func(args UmsMenuList) ([]UmsMenu, error)
	ListAll          func() ([]UmsMenu, error)
	UpdateHidden     func(id int64, hidden int32) (int64, error) `args:"id,hidden"`
}

//type UmsMenu struct {
//	Id         int64     `json:"id" form:"id" uri:"id" v:"id"`
//	ParentId   int64     `json:"parent_id" form:"parent_id" uri:"parent_id" v:"parent_id"`         // 父级ID
//	Title      string    `json:"title" form:"title" uri:"title" v:"title"`                         // 菜单名称
//	Level      int32     `json:"level" form:"level" uri:"level" v:"level"`                         // 菜单级数
//	Sort       int32     `json:"sort" form:"sort" uri:"sort" v:"sort"`                             // 菜单排序
//	Name       string    `json:"name" form:"name" uri:"name" v:"name"`                             // 前端名称
//	Icon       string    `json:"icon" form:"icon" uri:"icon" v:"icon"`                             // 前端图标
//	Hidden     int32     `json:"hidden" form:"hidden" uri:"hidden" v:"hidden"`                     // 前端隐藏
//	CreateTime time.Time `json:"create_time" form:"create_time" uri:"create_time" v:"create_time"` // 创建时间
//}

// 分页查询
type UmsMenuList struct {
	ParentId int64 `json:"parent_id" form:"parent_id"` // 父级ID
	PageNum  int   `json:"page_num" form:"page_num"`
	PageSize int   `json:"page_size" form:"page_size"`
}

// 子级菜单
type UmsMenuNode struct {
	Id         int64          `json:"id"`
	ParentId   int64          `json:"parent_id"`   // 父级ID
	Title      string         `json:"title"`       // 菜单名称
	Level      int32          `json:"level"`       // 菜单级数
	Sort       int32          `json:"sort"`        // 菜单排序
	Name       string         `json:"name"`        // 前端名称
	Icon       string         `json:"icon"`        // 前端图标
	Hidden     int32          `json:"hidden"`      // 前端隐藏
	CreateTime time.Time      `json:"create_time"` // 创建时间
	Children   []*UmsMenuNode `json:"children"`
}

//菜单列表
func (m *UmsMenu) MenuList() ([]*UmsMenuNode, error) {
	return m.GetMenu(0)
}

//递归获取树形菜单
func (m *UmsMenu) GetMenu(parentId int64) ([]*UmsMenuNode, error) {
	o := orm.NewOrm()
	var list []UmsMenu
	//menu, err := UmsMenuDao.SelectByParentId(parentId)
	//获取parentId的所有子菜单
	o.QueryTable("ums_menu").Filter("parent_id", parentId).OrderBy("sort").All(&list)

	tree := make([]*UmsMenuNode, 0)
	for _, item := range list {
		child, _ := item.GetMenu(item.Id) //获取parentId每一个子菜单的子菜单
		node := &UmsMenuNode{
			Id:         item.Id,
			ParentId:   item.ParentId,
			Title:      item.Title,
			Level:      item.Level,
			Sort:       item.Sort,
			Name:       item.Name,
			Icon:       item.Icon,
			Hidden:     item.Hidden,
			CreateTime: item.CreateTime,
		}
		node.Children = child
		tree = append(tree, node)
	}
	return tree, nil
}
